AWS Elastic Beanstalk + WordPress でIPアドレス制御の小ネタ
こんばんわ、モバイルアプリサービス部の清田です。
昨今のAWS Elastic Beanstalk + WordPressの構成でWebサイトを管理することが多くなってきました。 自分はUIデザイン、フロントエンド実装パートを担当することもあり、WordPress先生にお世話になった際に出会った小ネタをご紹介できればと思います。
ちなみにAWS Elastic Beanstalk + WordPress構成でWebサイトを立ち上げにご興味がある方は、こちらの記事をご一読いただければと思います。
- AWS Elastic BeanstalkでWordPressを始める
- AWS Elastic Beanstalk+WordPressで簡単にWebサイトを作る
- AWS CloudFrontを使ってWordPressのメディアファイルだけS3に配置する
AWS構成図
まずはAWS構成図について、実際に構築された環境は以下とほぼ同じ構成で弊社森永さん作の構成図を拝借させていただきます。
WordPress管理画面にアクセス制限をかけたい
WordPressを運用していくと、セキュリティー面から/wp-admin/のディレクトリには、特定のIPアドレスからのみアクセスを許可したいといった要望がでてきたりします。
その場合、多いパターンとして /wp-admin/ ディレクトリ配下に、 .htaccessファイルを設置し、指定したIPアドレスのみアクセスを許可するといた対応をとることが多いかと思います。
Order deny,allow Deny from all #許可するIPアドレス Allow from xxx.xxx.xxx.xx <FilesMatch "(admin-ajax.php)$"> Satisfy Any Order allow,deny Allow from all Deny from none </FilesMatch>
指定した許可IPアドレスでもアクセスできない
.htaccessファイルに、指定されたIPアドレス経由でも弾かれてしまうことがありました。 原因を探っていると、classmethod USA シアトルで活躍中の望月が執筆した記事で解決することができました。
原因として
AWS Elastic Beanstalk + WordPressの構成でもELB配下にWordPress実行サーバーを配置しているため、 ELBのプライベートIPアドレスが送信元IPアドレスとして認識されていたことが原因でした。
ここはApacheでアクセス制御を実施しましょう。クライアントからのリクエストを直接EC2が受け付ける形であればRequire ip 192.168.x.yのように書けば、特定のIPアドレスのアクセス制限を実現可能です。
しかし、上の例で示したIPアドレスは送信元のIPアドレスを示すため、ELB + Apacheの環境ではELBのプライベートIPアドレスが送信元IPアドレスとして認識されるので、この通りではいけません。ELBのIPアドレスを許可してしまうと、結果的にELBを介した全クライアントからのアクセスを許可することになってしまいます。
解決策
WordPress実行サーバーのhttpd.confファイルに以下の指定を記述することで、指定したIPアドレスを認識することができました
# 送信元IPアドレスとして、X-Forwarded-Forを利用する RemoteIPHeader X-Forwarded-For
httpd.confが初期状態に
安心したのもつかのま、httpd.confが初期状態になってしまうことが発生。
- Auto scaling時にスケールアウトした時
- eb deploy時?(調査中)
おそらく上記のタイミングで、サーバーが立ち上がってアプリケーション実行ファイル(WordPressファイル一式)の展開まではEB側で対応してもらっていたが、カスタマイズしたhttpd.confまで作成していなかったことが原因でした。
.ebextensionsで解決
弊社Elastic Beanstalkマイスターの都元の記事より、.ebextensions内の設定ファイルでいろいろできることが判明
その他プラットフォームであれば、ソースコードをzipで固めたものをS3にアップロードします。このようなzipファイルをBeanstalkでは「アプリケーションバンドル」と呼びます。
このアプリケーションバンドル内のルート・ディレクトリ直下に.ebextensionsというディレクトリを作り、その内部に(任意の名前).configというファイルを置いておくことにより、アプリケーション側からBeanstalkに対して、設定の指示を行うことができます。
httpd.confファイルを作成
今回はちょっと無理やりな方法ですが、、、.ebextensionsでhttpd.confファイルを作り替えてしまうという荒業で対応しています。
以下、wordpress実行ファイルと同じ階層に以下ファイルを設置
.ebextensions/01_httpd_conf.config
files: "/etc/httpd/conf/httpd.conf": mode: "000644" owner: root group: root content: | # httpd.confの設定内容を記載 # 送信元IPアドレスとして、X-Forwarded-Forを利用する RemoteIPHeader X-Forwarded-For
デプロイコマンド実行後、各サーバー側にカスタマイズされたhttpd.confが展開されていることが確認できました。
まとめ
日頃、UIデザインやフロントエンドの実装の日々で、あまりAWSプロダクトと戯れる機会は多くはない自分ですが、Elastic Beanstalkは少ない手順でアプリケーションサーバーへデプロイを行えることに感動しました。